#include "lcd_spi.h"
#include "driver/spi_master.h"

#define BSP_SPI_SDA_GPIO_PIN 14
#define BSP_SPI_SCL_GPIO_PIN 21
#define BSP_SPI_CS_GPIO_PIN  11

static spi_device_handle_t lcd_spi_handle = NULL;

/**
 * @brief       初始化SPI
 * @param       无
 * @retval      无
 */
void bsp_spi_bus_init(int host_id, int size)
{
    spi_bus_config_t spi_bus_conf = { 0 };
    /* SPI总线配置 */
    spi_bus_conf.miso_io_num = -1;
    spi_bus_conf.mosi_io_num = BSP_SPI_SDA_GPIO_PIN; /* SPI_MOSI引脚 */
    spi_bus_conf.sclk_io_num = BSP_SPI_SCL_GPIO_PIN;  /* SPI_SCLK引脚 */
    spi_bus_conf.quadwp_io_num = -1;                  /* SPI写保护信号引脚，该引脚未使能 */
    spi_bus_conf.quadhd_io_num = -1;                  /* SPI保持信号引脚，该引脚未使能 */
    spi_bus_conf.max_transfer_sz = size;             /* 配置最大传输大小，以字节为单位 */
    /* 初始化SPI总线 */
    ESP_ERROR_CHECK(spi_bus_initialize(host_id, &spi_bus_conf, SPI_DMA_CH_AUTO));                                                /* 校验参数值 */
}



void bsp_spi_driver_init(int host_id, spi_device_handle_t *spi_handle)
{
    /* SPI驱动接口配置 */
    spi_device_interface_config_t dev_cfg = {
            .clock_speed_hz = (80 * 1000 * 1000),  /* SPI时钟 */
            .mode = 0,                           /* SPI模式0 */
            .spics_io_num = BSP_SPI_CS_GPIO_PIN, /* SPI设备引脚 */
            .queue_size = 8,                     /* 事务队列尺寸 7个 */
    };
    /* 添加SPI总线设备 */
    spi_bus_add_device(host_id, &dev_cfg, spi_handle); /* 配置SPI总线设备 */
}

/**
 * @brief       SPI发送一个字节
 * @param       handle : SPI句柄
 * @param       dat    : 字节内容
 * @retval      无
 */
void bsp_spi_write_byte(uint8_t dat)
{
    spi_transaction_t t = { 0 };
    t.length = 8;                                  /* 要传输的位数 一个字节 8位 */
    t.tx_buffer = &dat;                            /* 将命令填充进去 */
    ESP_ERROR_CHECK(spi_device_polling_transmit(lcd_spi_handle, &t));
}

/**
 * @brief       SPI连续发送len个字节
 * @param       handle : SPI句柄
 * @param       dat    : 要发送的字节地址
 * @param       len    : 要发送的字节长度
 * @retval      无
 */
 void bsp_spi_write_data( int len, const uint8_t* dat)
{
    if (len == 0 || dat == NULL)  /* 长度为0 没有数据要传输 */
    {
        return;
    }
    spi_transaction_t t = { 0 };
    t.length = len * 8;                            /* 要传输的位数 一个字节 8位 */
    t.tx_buffer = dat;                             /* 将命令填充进去 */
    ESP_ERROR_CHECK(spi_device_polling_transmit(lcd_spi_handle, &t));
}


void lcd_spi_init(int host_id, int max_ts_sz)
{
    bsp_spi_bus_init(host_id, max_ts_sz);
    bsp_spi_driver_init(host_id, &lcd_spi_handle);
}